1 /* Copyright 2006-2011 The MathWorks, Inc. */
2
3 /*
4 * File: xil_interface_lib.c
5 *
6 * SIL/PIL support library
7 *
8 */
9
10 #include "xil_interface_lib.h"
11 #include "xil_interface_lib_private.h"
12 #include "xil_data_stream.h"
13 #include "xil_interface.h"
14 #ifdef LDRA_ENABLED
15 #include "code_coverage_utils.h"
16 #endif /* LDRA_ENABLED */
17
18 /* Internal state variable holding information about the
19 * XILIOData currently being processed.
20 *
21 * Note: this variable is shared by UDATA processing code
22 * and YDATA processing code and used for all IO.
23 *
24 */
25 static XILIOData * xilIODataPtr;
26
27 /* static functions */
28 static void getNextXILIOData(void) {
29 /* increment xilIOData ptr if we have not reached the end */
30 if (xilIODataPtr->memUnitLength!=0) {
31 xilIODataPtr++;
32 }
33 }
34
35 static XIL_PROCESSDATA_ERROR_CODE processData(XIL_IO_TYPE io_type,
36 uint32_T fcnid,
37 XIL_COMMAND_TYPE_ENUM command,
38 uint32_T commandIdx) {
39 XIL_PROCESSDATA_ERROR_CODE processDataErrorCode = XIL_PROCESSDATA_SUCCESS;
40 int moreXILIOData = 1;
41 /* initialise before beginning to process data */
42 switch(io_type) {
43 case XIL_UDATA_IO:
44 if (xilGetUIOData(fcnid, command, commandIdx, &xilIODataPtr)) {
45 /* no udata processing to be done - we're complete */
46 processDataErrorCode = XIL_PROCESSDATA_SUCCESS;
47 return processDataErrorCode;
48 }
49 break;
50 case XIL_YDATA_IO: {
51 MemUnit_T responseId = XIL_RESPONSE_OUTPUT_DATA;
52 if (xilGetYIOData(fcnid, command, commandIdx, &xilIODataPtr)) {
53 /* no ydata processing to be done - we're complete */
54 processDataErrorCode = XIL_PROCESSDATA_SUCCESS;
55 return processDataErrorCode;
56 }
57 /* send response id */
58 if (xilWriteData(&responseId, sizeof(responseId)) != XIL_DATA_STREAM_SUCCESS) {
59 processDataErrorCode = XIL_PROCESSDATA_DATA_STREAM_ERROR;
60 return processDataErrorCode;
61 }
62 break;
63 }
64 default:
65 /* programming error */
66 processDataErrorCode = XIL_PROCESSDATA_IO_TYPE_ERROR;
67 return processDataErrorCode;
68 }
69 while(moreXILIOData) {
70 switch(io_type) {
71 case XIL_UDATA_IO:
72 if (xilReadData(xilIODataPtr->address, xilIODataPtr->memUnitLength) != XIL_DATA_STREAM_SUCCESS) {
73 processDataErrorCode = XIL_PROCESSDATA_DATA_STREAM_ERROR;
74 return processDataErrorCode;
75 }
76 break;
77 case XIL_YDATA_IO:
78 if (xilWriteData(xilIODataPtr->address, xilIODataPtr->memUnitLength) != XIL_DATA_STREAM_SUCCESS) {
79 processDataErrorCode = XIL_PROCESSDATA_DATA_STREAM_ERROR;
80 return processDataErrorCode;
81 }
82 break;
83 default:
84 /* programming error */
85 processDataErrorCode = XIL_PROCESSDATA_IO_TYPE_ERROR;
86 return processDataErrorCode;
87 }
88 /* get next xilIOData */
89 getNextXILIOData();
90 if (xilIODataPtr->memUnitLength == 0) {
91 moreXILIOData = 0;
92 }
93 }
94 return processDataErrorCode;
95 }
96
97 static XIL_INTERFACE_LIB_ERROR_CODE finalizeCommandResponse(XIL_RESPONSE_ERROR_ID errorId) {
98 /* only send the error id if necessary */
99 if (errorId != XIL_RESPONSE_ERROR_SUCCESS) {
100 /* send response id code */
101 MemUnit_T memUnitData = XIL_RESPONSE_ERROR;
102 if (xilWriteData(&memUnitData, sizeof(memUnitData)) != XIL_DATA_STREAM_SUCCESS) {
103 return XIL_INTERFACE_LIB_ERROR;
104 }
105 /* send error id */
106 memUnitData = (MemUnit_T) errorId;
107 if (xilWriteData(&memUnitData, sizeof(memUnitData)) != XIL_DATA_STREAM_SUCCESS) {
108 return XIL_INTERFACE_LIB_ERROR;
109 }
110 }
111 /* flush the output stream
112 * before beginning next command */
113 if (xilDataFlush() != XIL_DATA_STREAM_SUCCESS) {
114 return XIL_INTERFACE_LIB_ERROR;
115 }
116 return XIL_INTERFACE_LIB_SUCCESS;
117 }
118
119 #define XIL_COMMAND_TYPE_SIZE sizeof(MemUnit_T)
120 #define XIL_COMMAND_FCNID_SIZE sizeof(uint32_T)
121 #define XIL_COMMAND_XILTID_SIZE sizeof(uint32_T)
122 #define XIL_COMMAND_ERROR_STATUS_SIZE sizeof(MemUnit_T)
123
124 #define XIL_RUN_EXIT_ERROR interfaceErrorCode = XIL_INTERFACE_LIB_ERROR; \
125 return interfaceErrorCode
126 #define XIL_RUN_EXIT return interfaceErrorCode
127
128 XIL_INTERFACE_LIB_ERROR_CODE xilRun(void) {
129 XIL_INTERFACE_LIB_ERROR_CODE interfaceErrorCode = XIL_INTERFACE_LIB_SUCCESS;
130 XIL_COMMAND_TYPE_ENUM command;
131 MemUnit_T commandCode;
132 uint32_T fcnid;
133 uint32_T xilTID = 0;
134 uint32_T commandIdx = 0;
135
136 /* read the command code */
137 if (xilReadData(&commandCode, XIL_COMMAND_TYPE_SIZE) != XIL_DATA_STREAM_SUCCESS) {
138 XIL_RUN_EXIT_ERROR;
139 }
140
141 /* cast from the MemUnit commandCode to the enumeration commandCode */
142 command = (XIL_COMMAND_TYPE_ENUM) commandCode;
143
144 /* read fcnid */
145 if (xilReadData((MemUnit_T *) &fcnid, XIL_COMMAND_FCNID_SIZE) != XIL_DATA_STREAM_SUCCESS) {
146 XIL_RUN_EXIT_ERROR;
147 }
148
149 /* update commandIdx */
150 switch(command) {
151 case XIL_INIT_COMMAND:
152 case XIL_INITIALIZE_COMMAND:
153 case XIL_INITIALIZE_CONDITIONS_COMMAND:
154 case XIL_CONST_OUTPUT_COMMAND:
155 case XIL_TERMINATE_COMMAND:
156 case XIL_PROCESS_PARAMS_COMMAND:
157 /* no commandIdx */
158 break;
159 case XIL_STEP_COMMAND:
160 case XIL_ENABLE_COMMAND:
161 case XIL_DISABLE_COMMAND:
162 /* read xilTID */
163 if (xilReadData((MemUnit_T *) &xilTID, XIL_COMMAND_XILTID_SIZE) != XIL_DATA_STREAM_SUCCESS) {
164 XIL_RUN_EXIT_ERROR;
165 }
166 commandIdx = xilTID;
167 break;
168 default:
169 XIL_RUN_EXIT_ERROR;
170 }
171
172 /* process inputs if required by command */
173 switch(command) {
174 case XIL_INIT_COMMAND:
175 case XIL_CONST_OUTPUT_COMMAND:
176 /* no inputs */
177 break;
178 case XIL_INITIALIZE_COMMAND:
179 case XIL_INITIALIZE_CONDITIONS_COMMAND:
180 case XIL_STEP_COMMAND:
181 case XIL_ENABLE_COMMAND:
182 case XIL_DISABLE_COMMAND:
183 case XIL_TERMINATE_COMMAND:
184 case XIL_PROCESS_PARAMS_COMMAND:
185 {
186 XIL_PROCESSDATA_ERROR_CODE processDataError;
187 /* process UData */
188 processDataError = processData(XIL_UDATA_IO, fcnid, command, commandIdx);
189 if (processDataError == XIL_PROCESSDATA_DATA_STREAM_ERROR) {
190 XIL_RUN_EXIT_ERROR;
191 } else if (processDataError != XIL_PROCESSDATA_SUCCESS) {
192 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_PROCESS_UDATA) != XIL_INTERFACE_LIB_SUCCESS) {
193 XIL_RUN_EXIT_ERROR;
194 }
195 else {
196 XIL_RUN_EXIT;
197 }
198 }
199 }
200 break;
201 default:
202 XIL_RUN_EXIT_ERROR;
203 }
204
205 /* call xilInterface function */
206 switch(command) {
207 case XIL_INIT_COMMAND:
208 if (xilGetDataTypeInfo() != XIL_INTERFACE_SUCCESS) {
209 XIL_RUN_EXIT_ERROR;
210 }
211 break;
212 case XIL_CONST_OUTPUT_COMMAND:
213 /* no function */
214 break;
215 case XIL_PROCESS_PARAMS_COMMAND:
216 if (xilProcessParams(fcnid) != XIL_INTERFACE_SUCCESS) {
217 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_PROCESS_PARAMS) != XIL_INTERFACE_LIB_SUCCESS) {
218 XIL_RUN_EXIT_ERROR;
219 }
220 else {
221 XIL_RUN_EXIT;
222 }
223 }
224 break;
225 case XIL_INITIALIZE_COMMAND:
226 if (xilInitialize(fcnid) != XIL_INTERFACE_SUCCESS) {
227 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_INITIALIZE) != XIL_INTERFACE_LIB_SUCCESS) {
228 XIL_RUN_EXIT_ERROR;
229 }
230 else {
231 XIL_RUN_EXIT;
232 }
233 }
234 break;
235 case XIL_INITIALIZE_CONDITIONS_COMMAND:
236 if (xilInitializeConditions(fcnid) != XIL_INTERFACE_SUCCESS) {
237 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_INITIALIZE_CONDITIONS) != XIL_INTERFACE_LIB_SUCCESS) {
238 XIL_RUN_EXIT_ERROR;
239 }
240 else {
241 XIL_RUN_EXIT;
242 }
243 }
244 break;
245 case XIL_STEP_COMMAND:
246 /* call output */
247 if (xilOutput(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
248 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_STEP) != XIL_INTERFACE_LIB_SUCCESS) {
249 XIL_RUN_EXIT_ERROR;
250 }
251 else {
252 XIL_RUN_EXIT;
253 }
254 }
255 /* call update */
256 if (xilUpdate(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
257 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_UPDATE) != XIL_INTERFACE_LIB_SUCCESS) {
258 XIL_RUN_EXIT_ERROR;
259 }
260 else {
261 XIL_RUN_EXIT;
262 }
263 }
264 break;
265 case XIL_TERMINATE_COMMAND:
266 if (xilTerminate(fcnid) != XIL_INTERFACE_SUCCESS) {
267 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_TERMINATE) != XIL_INTERFACE_LIB_SUCCESS) {
268 XIL_RUN_EXIT_ERROR;
269 }
270 else {
271 XIL_RUN_EXIT;
272 }
273 }
274 break;
275 case XIL_ENABLE_COMMAND:
276 if (xilEnable(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
277 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_ENABLE) != XIL_INTERFACE_LIB_SUCCESS) {
278 XIL_RUN_EXIT_ERROR;
279 }
280 else {
281 XIL_RUN_EXIT;
282 }
283 }
284 break;
285 case XIL_DISABLE_COMMAND:
286 if (xilDisable(fcnid, xilTID) != XIL_INTERFACE_SUCCESS) {
287 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_DISABLE) != XIL_INTERFACE_LIB_SUCCESS) {
288 XIL_RUN_EXIT_ERROR;
289 }
290 else {
291 XIL_RUN_EXIT;
292 }
293 }
294 break;
295 default:
296 XIL_RUN_EXIT_ERROR;
297 }
298
299 /* process outputs if required by command */
300 switch(command) {
301 case XIL_INIT_COMMAND:
302 case XIL_PROCESS_PARAMS_COMMAND:
303 /* no I/O */
304 break;
305 case XIL_INITIALIZE_COMMAND:
306 case XIL_INITIALIZE_CONDITIONS_COMMAND:
307 case XIL_CONST_OUTPUT_COMMAND:
308 case XIL_STEP_COMMAND:
309 case XIL_ENABLE_COMMAND:
310 case XIL_DISABLE_COMMAND:
311 case XIL_TERMINATE_COMMAND:
312 {
313 XIL_PROCESSDATA_ERROR_CODE processDataError;
314 /* process YData */
315 processDataError = processData(XIL_YDATA_IO, fcnid, command, commandIdx);
316 if (processDataError == XIL_PROCESSDATA_DATA_STREAM_ERROR) {
317 XIL_RUN_EXIT_ERROR;
318 } else if (processDataError != XIL_PROCESSDATA_SUCCESS) {
319 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_PROCESS_YDATA) != XIL_INTERFACE_LIB_SUCCESS) {
320 XIL_RUN_EXIT_ERROR;
321 }
322 else {
323 XIL_RUN_EXIT;
324 }
325 }
326 }
327 break;
328 default:
329 XIL_RUN_EXIT_ERROR;
330 }
331
332 #ifdef LDRA_ENABLED
333 /* upload code coverage execution history from target*/
334 if (command == XIL_TERMINATE_COMMAND) {
335 callTargetUploadFcns();
336 }
337 #endif /* LDRA_ENABLED */
338
339 /* finalize the response */
340 if (finalizeCommandResponse(XIL_RESPONSE_ERROR_SUCCESS) != XIL_INTERFACE_LIB_SUCCESS) {
341 XIL_RUN_EXIT_ERROR;
342 }
343
344 /* Terminate this process when XIL simulation is complete */
345 if (command == XIL_TERMINATE_COMMAND) {
346 interfaceErrorCode = XIL_INTERFACE_LIB_TERMINATE;
347 }
348 XIL_RUN_EXIT;
349 }
350
|